/*
 * debugcmd.h
 *
 *  Created on: 2020年2月24日
 *      Author: wangbing
 *      Email : mz8023yt@163.com
 */

#ifdef __cplusplus
extern "C" {
#endif

#ifndef MAZ_DEBUGCMD_H_
#define MAZ_DEBUGCMD_H_

#include "debug.h"
#include "debugcmd_config.h"
#include "list.h"

/* 1. TYPE: Data type */
#define uint8_t  unsigned char
#define uint16_t unsigned short
#define uint32_t unsigned int

/* 2. MAZRET: State code returned */
#define MTRUE          1
#define MFALSE         0
#define MAZRET_TRUE    MTRUE
#define MAZRET_FALSE   MFALSE
#define MENABLE        1
#define MDISABLE       0
#define MAZRET_ENBALE  MENABLE
#define MAZRET_DISABLE MDISABLE

#define MAZRET_REMOTECMD 100

#define MAZRET_OK        0
#define MAZRET_NG        -1
#define MAZRET_EINVAL    -2  /* Invalid argument */
#define MAZRET_ENOITEM   -3  /* No such item */
#define MAZRET_ENOCMD    -4  /* No such command */
#define MAZRET_ENOSUBCMD -5  /* No such sub command */
#define MAZRET_ENULLP    -6  /* Null pointer exception */
#define MAZRET_EEXIST    -7  /* File exists */
#define MAZRET_EEXE      -8  /* Command exe fail */
#define MAZRET_ENEWLINE  -9  /* New line */
#define MAZRET_EAUTO     -10 /* Auto completion */
#define MAZRET_ERING     -11 /* Ring */
#define MAZRET_EDEV      -12 /* No devices */

/**
 * @brief 调试命令组件版本号
 */
#define DEBUGCMD_MAIN_VER 1
#define DEBUGCMD_SUB_VER  2
#define DEBUGCMD_REV_VER  0

/**
 * @brief 命令回调函数原型
 */
typedef int (*DEBUGCMD_HANDLER)(void* cmd, char* param);

/**
 * @brief 子命令类型
 */
typedef struct _DEBUGCMD_SUB_CMD_ {
	char* name;               // 子命令名称
	char* desc;               // 子命令描述信息
	DEBUGCMD_HANDLER handler; // 子命令回调函数
	struct list_head list;    // 子命令链表成员
	int registered;           // 是否注册标记
} DEBUGCMD_SCMD;

/**
 * @brief 主命令类型
 */
typedef struct _DEBUGCMD_MAIN_CMD_ {
	char* name;               // 主命令名称
	char* desc;               // 主命令描述信息
	DEBUGCMD_HANDLER handler; // 主命令回调函数, 遍历子命令链表, 并打印字命令的描述信息
	DEBUGCMD_SCMD cmds;       // 主命令下绑定的子命令链表
	struct list_head list;    // 主命令链表成员
	int registered;           // 是否注册标记
} DEBUGCMD_MCMD;

/**
 * @brief API接口
 */
int debugcmd_init(void);
int debugcmd_deinit(void);
int debugcmd_mcmd_register(DEBUGCMD_MCMD* mcmd);
int debugcmd_mcmd_unregister(DEBUGCMD_MCMD* mcmd);
int debugcmd_scmd_register(DEBUGCMD_MCMD* mcmd, DEBUGCMD_SCMD* scmd);
int debugcmd_scmd_unregister(DEBUGCMD_SCMD* scmd);
int debugcmd_execute(char* str);
int debugcmd_automatic_completion(char* str, char* fill, int* length);
int debugcmd_export(char* filename);
int debugcmd_param_only_space(char* str);

#endif /* MAZ_DEBUGCMD_H_ */

#ifdef __cplusplus
}
#endif
